package com.micro.balance;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;

import org.springframework.stereotype.Component;

/**
 * 权重轮询负载均衡策略
 * 继承自AbstractLoadBalance抽象类
 */
@Component("roundbinweight")
public class RoundbinWeightLoadBalance extends AbstractLoadBalance{
    // 当前位置，用于轮询
	private static int pos=0;

	/**
	 * 执行选择的逻辑
	 * 根据服务的权重来进行轮询选择
	 * @param map 服务及其权重的映射
	 * @return 选定的服务名称
	 */
	@Override
	protected String doSelect(Map<String, Integer> map) {
		// 创建一个列表，用于存放根据权重展开的服务名称
		ArrayList<String> lists = new ArrayList<String>();

		// 根据权重来生成比重的数据放入List集合
		Iterator<String> iterator = map.keySet().iterator();
		while (iterator.hasNext()) {
			String key = iterator.next();
			Integer weight = map.get(key);

			// 根据权重将服务名称添加到列表中
			for (int i = 0; i < weight; i++) {
				lists.add(key);
			}
		}

		// 开始轮询
		String result = "";
		// 同步代码块，保证并发安全
		synchronized (RoundbinLoadBalance.class) {
			// 如果当前位置超过了列表大小，则重置位置
			if ( pos >= lists.size() ) {
				pos = 0;
			}
			// 获取当前位置的服务名称，并将位置向前移动
			result = lists.get(pos);
			pos++;
		}

        // 返回选定的服务名称
        return result;
	}

}

